//
// Created by win10 on 24-11-20.
//
//
// Created by win10 on 24-11-15.
//
//基于链式存储结构的 队列数据结构 实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//1.定义一个队列的节点
typedef struct{
//数据域
int data;
//指针域
struct QNode * next;//节点结构类型 一致

}QNode;

//2.定义队列的头节点
typedef struct{
  //队头指针
  QNode * front;
  //队尾指针
  QNode * rear;

}Queue;

//3.初始化队列 ==>给队列分配一个空间，并且初始化队头和队尾的指针
Queue * initQueue(){
    //给队列分配一个动态空间 malloc
    Queue * q = (Queue *)malloc(sizeof(Queue));
    //判断空间是否足够
    if(q == NULL){
      return NULL;
    }
    //初始化 队头和队尾的指针
    q -> front = q-> rear = NULL;
    return q;
}

//4.判断队列是否为空
int isQueueEmpty(Queue * q) {
  return q -> front == NULL;//队列的队头指针  指向为空
}

//5.入队操作
void enQueue(Queue * q, int data) {
  //为新节点开辟一个新的空间
  QNode * newNode = (QNode *)malloc(sizeof(QNode));
  if(newNode == NULL) {
    //判断节点是否新建成功
    return;
  }
  //节点的赋值  数据域  指针域
  newNode -> data = data;
  newNode -> next = NULL;

  //修改队头指针 队尾指针
  //判断队列是否为空 ==》为空 节点是队列的第一个节点 同时修改 队头和队尾
  if(isQueueEmpty(q)) {
    q -> front = newNode;
    q -> rear = newNode;
  }
  //反之 仅对队尾进行操作
  else {
    q -> rear -> next = newNode;//原队尾节点的指针域 添入 新节点地址
    q -> rear = newNode;//队尾指针赋值给新节点
  }
}

//6.出队操作
int deQueue(Queue * q) {
  //判断是否为空 如果为空返回为假
  if(isQueueEmpty(q)) {
    return -1;
  }
  //定位到要出队的节点
  QNode * temp = q -> front;//因为队列的特性 要出队的节点是固定的
  int value = temp -> data;//将要出队的值保留在value中
  //队头指针 从原首节点 后移至 新首节点（原首节点的后置节点）
  q -> front = q->front-> next;
  //判断 此时 队列是否为空
  if(q->front == NULL) {
    q -> rear = NULL;
  }
  //释放该节点
  free(temp);
  return value ;
}

//7.销毁该队列
void displayQueue(Queue * q) {
  while(!isQueueEmpty(q)) {
    deQueue(q);
  }
  free(q);
}

//约瑟夫环
void josephus(int n,int p) {
  //初始化队列
  QNode * temp =initQueue();
  int count=0;

  //让n个数据入队.
  for(int i=1;i<=n;i++) {
    enQueue(temp,i);
  }
  //做第一个循环 保证所有值都被出列
  while(!isQueueEmpty(temp)) {
    //做第二个循环 循环到第p个元素 出列
    for(int i=1;i<p;i++) {
      enQueue(temp,deQueue(temp));//第一个元素到队尾
    }
    //第p个元素，出队
    if(count==n-1) {
      printf("%d",deQueue(temp));
    }else {
      printf("%d ",deQueue(temp));
    }
    count++;
  }
  printf("\n");
  displayQueue(temp);
  }

int main(void){
  //创建新的队列
  // Queue * q = initQueue();
  int a,b;
  scanf("%d %d", &a, &b);
  josephus(a,b);
}